package com.cmii.sjw.department.control.jsc.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmii.sjw.department.control.jsc.mapper.MenuMapper;
import com.cmii.sjw.department.control.jsc.model.dto.MenuQueryDTO;
import com.cmii.sjw.department.control.jsc.model.entity.Menu;
import com.cmii.sjw.department.control.jsc.model.vo.MenuNode;
import com.cmii.sjw.department.control.jsc.service.MenuService;
import com.cmii.sjw.department.control.jsc.util.MenuTreeUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * @Description 菜单服务实现类
 * @Author jfh
 * @Date 2025-04-08 周二 15:42
 * @Version 1.0
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {

    /**
     * 获取菜单树结构
     * @return 菜单树结构列表
     */
    @Override
    public List<MenuNode> getMenuTree() {
        List<Menu> menus = this.list();
        return MenuTreeUtil.buildTree(menus);
    }

    /**
     * 保存或更新菜单
     * @param menu 菜单对象
     * @return 保存结果
     */
    @Override
    public boolean saveMenu(Menu menu) {
        // 设置默认值
        if (menu.getRoute() == null) {
            menu.setRoute(1);
        }
        if (menu.getSortNo() == null) {
            menu.setSortNo(0);
        }
        return this.saveOrUpdate(menu);
    }

    /**
     * 删除菜单
     * @param id 菜单ID
     * @return 删除结果
     */
    @Override
    public boolean deleteMenu(Long id) {
        // 检查是否有子菜单
        Long count = this.lambdaQuery()
                .eq(Menu::getParentId, id)
                .count();
        if (count > 0) {
            throw new RuntimeException("存在子菜单，无法删除");
        }
        return this.removeById(id);
    }

    /**
     * 获取菜单列表
     * @return 菜单列表
     */
    @Override
    public List<Menu> getMenuList() {
        return this.list();
    }

    /**
     * 根据ID获取菜单
     * @param id 菜单ID
     * @return 菜单对象
     */
    @Override
    public Menu getMenuById(Long id) {
        return this.getById(id);
    }

    /**
     * 根据条件获取菜单列表
     * @param queryDTO 查询条件
     * @return 菜单列表
     */
    @Override
    public List<Menu> getMenuListByCondition(MenuQueryDTO queryDTO) {
        LambdaQueryWrapper<Menu> wrapper = new LambdaQueryWrapper<>();

        if (StringUtils.hasText(queryDTO.getName())) {
            wrapper.like(Menu::getName, queryDTO.getName());
        }
        if (queryDTO.getParentId() != null) {
            wrapper.eq(Menu::getParentId, queryDTO.getParentId());
        }
        if (queryDTO.getRoute() != null) {
            wrapper.eq(Menu::getRoute, queryDTO.getRoute());
        }

        wrapper.orderByAsc(Menu::getSortNo);
        return this.list(wrapper);
    }
}
